home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Fichero: CALC87.ASM
- ;
- ; Versi≤n: 1.0
- ; Autor: Antonio M. EstΘvez Lorenzo
- ; Prop≤sito: Eval·a expresiones matemßticas
- ;
- ; Para ensamblar: TASM /ml [/dc87] calc87
- ; /ml -> Sensible a may·sculas/min·sculas
- ; /dc87 -> Define la constante c87 (parßmetro opcional)
- ; Si no se incluye se emplerßn instruciones de
- ; emulaci≤n de coprocesador
-
- .MODEL large, Pascal
-
- LOCALS @@
-
- .286
-
- EMUL
-
- ifdef c87
- .287
- elseifdef C87
- .287
- else
- EMUL
- endif
-
- INCLUDE OBJECTS.INC
- INCLUDE CALC87.INC
-
- Dominio = 0
- Singular= 1
- Overflow= 2
-
- EXTRN C pow: FAR
- EXTRN C log: FAR
- EXTRN C DivisionPorCero: FAR
- EXTRN C ErrorFuncion: FAR
-
- EXTRN C ErrorMatemat: WORD
- EXTRN C varN: QWORD
-
- .CONST
-
- szOper DB 0
- Cero DT 1E-15
- Infinito DT 1E15
- Dos DT 2.0
- cteEnt DW 1F3FH
-
- .DATA
-
- IntTemp DW ?
-
- .CODE
-
- szACOSH DB "acosh",0
- szATANH DB "atanh",0
- szFACT DB "fact", 0
-
- asinh PROC C Num: QWORD
- PUBLIC C asinh
- LOCAL Tmp: QWORD
- FLD Num
- FLD ST(0)
- FMUL ST(0),ST
- FLD1
- FADDP
- FSQRT
- FADDP
- FSTP Tmp
- CALL log
- RET
- asinh ENDP
-
- acosh PROC C Num: QWORD
- PUBLIC C acosh
- LOCAL Tmp: QWORD
- FLD Num
- FLD1
- FCOMP ST(1)
- FSTSW AX
- SAHF
- JNBE @@1
- FLD ST
- FMUL ST,ST
- FLD1
- FSUBP
- FSQRT
- FADDP
- FSTP Tmp
- CALL log
- RET
- @@1: PUSH Dominio
- PUSH CS
- PUSH OFFSET szACOSH
- SUB SP,8
- MOV BX,SP
- FSTP QWORD PTR SS:[BX]
- CALL ErrorFuncion
- FLD1
- RET
- acosh ENDP
-
- atanh PROC C Num: QWORD
- PUBLIC C atanh
- LOCAL Tmp: QWORD
- FLD Num
- FABS
- FLD1
- FCOMPP ST(1)
- FSTSW AX
- FLD Num
- SAHF
- JC @@2
- JE @@1
- FLD1
- FSUB ST,ST(1)
- FLD1
- FADDP ST(2),ST
- FDIVP
- FSTP Tmp
- CALL log
- FLD Dos
- FDIVP
- RET
- @@1: PUSH Singular
- JMP SHORT @@3
- @@2: PUSH Dominio
- @@3: PUSH CS
- PUSH OFFSET szATANH
- SUB SP,8
- MOV BX,SP
- FSTP QWORD PTR SS:[BX]
- CALL ErrorFuncion
- FLD1
- RET
- atanh ENDP
-
- Negat PROC C Num: QWORD
- PUBLIC C Negat
- FLD Num
- FCHS
- RET
- Negat ENDP
-
- Inver PROC C Num: QWORD
- PUBLIC C Inver
- FLD1
- FLD Num
- FDIVP
- RET
- Inver ENDP
-
- Abs PROC C Num: QWORD
- PUBLIC C Abs
- FLD Num
- FABS
- RET
- Abs ENDP
-
- Ent PROC C Num: QWORD
- PUBLIC C Ent
- LOCAL Temp: WORD
- FLD Num
- FSTCW Temp
- FLDCW cteEnt
- FRNDINT
- FLDCW Temp
- RET
- Ent ENDP
-
- Frac PROC C Num: QWORD
- PUBLIC C Frac
- LOCAL Temp: WORD
- FLD Num
- FABS
- FLD ST(0)
- FSTCW Temp
- FLDCW cteEnt
- FRNDINT
- FLDCW Temp
- FSUBP ST(1),ST
- RET
- Frac ENDP
-
- Fact PROC C Num: QWORD
- PUBLIC C Fact
- LOCAL Buc: WORD
- LOCAL Tmp: QWORD
- FLD Num
- FSTP Tmp
- CALL Ent
- FIST Buc
- MOV CX,Buc
- CMP CX,33
- JA @@2
- OR CX,CX
- JZ @@3
- @@1: DEC CX
- JZ @@5
- FILD Buc
- FLD1
- FSUBP
- FIST Buc
- FMUL
- JMP @@1
- @@2: PUSH Overflow
- PUSH CS
- PUSH OFFSET szFACT
- SUB SP,8
- MOV BX,SP
- FSTP QWORD PTR SS:[BX]
- CALL ErrorFuncion
- ADD SP,14
- JMP SHORT @@4
- @@3: FIST Buc
- @@4: FLD1
- @@5: RET
- Fact ENDP
-
- Mult PROC NEAR
- FMULP
- RET
- Mult ENDP
-
- Divid PROC NEAR
- FLDZ
- FCOMP ST(1)
- FSTSW AX
- SAHF
- JZ @@1
- FDIVP
- RET
- @@1: MOV ErrorMatemat,1
- FADDP
- CALL DivisionPorCero
- RET
- Divid ENDP
-
- Suma PROC NEAR
- FADDP
- RET
- Suma ENDP
-
- Resta PROC NEAR
- FSUBP
- RET
- Resta ENDP
-
- Potencia PROC NEAR
- LOCAL Base: QWORD, Expn: QWORD
- FST Base
- CALL Ent
- FCOMP ST(1)
- FSTSW AX
- SAHF
- JE @@1
- FSTP Expn
- FSTP Base
- CALL pow
- @@0: RET
- @@1: FISTP IntTemp
- MOV AX,IntTemp
- OR AX,AX
- JZ @@4
- JG @@2
- NEG AX
- FLD1
- FDIVRP
- @@2: FST Base
- @@3: DEC AX
- JZ @@0
- FMUL Base
- JMP @@3
- @@4: FSTP Base
- FLD1
- JMP @@0
- Potencia ENDP
-
-
- @TBaseFunc@Operador$qzc PROC Oper: BYTE, @Self: DWORD
- PUBLIC @TBaseFunc@Operador$qzc
- MOV AL,Oper
- MOV CX,OFFSET Mult
- CMP AL,'+'
- JNE @@1
- MOV CX,OFFSET Suma
- @@1: CMP AL,'-'
- JNE @@2
- MOV CX,OFFSET Resta
- @@2: CMP AL,'/'
- JNE @@3
- MOV CX,OFFSET Divid
- @@3: CMP AL,'^'
- JNE @@4
- MOV CX,OFFSET Potencia
- @@4: LES BX,@Self
- MOV TBaseFunc@DirOper,CX
- RET
- @TBaseFunc@Operador$qzc ENDP
-
-
- @TVariable@Result$qv PROC @Self: DWORD
- PUBLIC @TVariable@Result$qv
- LOCAL Valor: QWORD
- LES BX,@Self
- LES BX,TVariable@Variable
- FLD QWORD PTR ES:[BX]
- LES BX,@Self
- LES BX,TBaseFunc@SigFunc
- MOV AX,ES
- OR AX,BX
- JZ @@1
- FSTP Valor
- Virtual TBaseFunc,Result,Actual
- FLD Valor
- LES BX,@Self
- CALL TBaseFunc@DirOper
- @@1: RET
- @TVariable@Result$qv ENDP
-
- @TNumero@Result$qv PROC @Self: DWORD
- PUBLIC @TNumero@Result$qv
- LOCAL Valor: QWORD
- LES BX,@Self
- FLD TNumero@Numero
- LES BX,@Self
- LES BX,TBaseFunc@SigFunc
- MOV AX,ES
- OR AX,BX
- JZ @@1
- FSTP Valor
- Virtual TBaseFunc,Result,Actual
- FLD Valor
- LES BX,@Self
- CALL TBaseFunc@DirOper
- @@1: RET
- @TNumero@Result$qv ENDP
-
- @TFunc@Result$qv PROC @Self: DWORD
- PUBLIC @TFunc@Result$qv
- LOCAL Valor: QWORD
- LES BX,@Self
- Virtual TBaseFunc,Result,TFunc@Subfunc
- LES BX,@Self
- LES BX,TBaseFunc@SigFunc
- MOV AX,ES
- OR AX,BX
- JZ @@1
- FSTP Valor
- Virtual TBaseFunc,Result,Actual
- FLD Valor
- LES BX,@Self
- CALL TBaseFunc@DirOper
- @@1: RET
- @TFunc@Result$qv ENDP
-
- @TSumatorio@Result$qv PROC @Self: DWORD
- PUBLIC @TSumatorio@Result$qv
- Local Temp: WORD
- LES BX,@Self
- MOV CX,TSerie@Desde
- MOV DX,TSerie@Hasta
- LES BX,TFunc@Subfunc
- MOV Temp,CX
- FLDZ
- @@1: CMP DX,Temp
- JL @@2
- FILD Temp
- FSTP varN
- PUSH DX
- PUSH ES
- PUSH BX
- Virtual TBaseFunc,Result,Actual
- FADDP
- POP BX
- POP ES
- POP DX
- INC Temp
- JMP @@1
- @@2: RET
- @TSumatorio@Result$qv ENDP
-
- @TProductorio@Result$qv PROC @Self: DWORD
- PUBLIC @TProductorio@Result$qv
- Local Temp: WORD
- LES BX,@Self
- MOV CX,TSerie@Desde
- MOV DX,TSerie@Hasta
- LES BX,TFunc@Subfunc
- MOV Temp,CX
- FLD1
- @@1: CMP DX,Temp
- JL @@2
- FILD Temp
- FSTP varN
- PUSH DX
- PUSH ES
- PUSH BX
- Virtual TBaseFunc,Result,Actual
- FMULP
- POP BX
- POP ES
- POP DX
- INC Temp
- JMP @@1
- @@2: RET
- @TProductorio@Result$qv ENDP
-
- @TFuncMat@Result$qv PROC @Self: DWORD
- PUBLIC @TFuncMat@Result$qv
- LOCAL Valor: QWORD
- LES BX,@Self
- Virtual TBaseFunc,Result,TFunc@Subfunc
- FSTP Valor
- LES BX,@Self
- CALL TFuncMat@FuncMat
- LES BX,@Self
- LES BX,TBaseFunc@SigFunc
- MOV AX,ES
- OR AX,BX
- JZ @@1
- FSTP Valor
- Virtual TBaseFunc,Result,Actual
- FLD Valor
- LES BX,@Self
- CALL TBaseFunc@DirOper
- @@1: RET
- @TFuncMat@Result$qv ENDP
-
- @TFuncion@Result$qv PROC @Self: DWORD
- PUBLIC @TFuncion@Result$qv
- MOV ErrorMatemat,0
- LES BX,@Self
- CMP TFuncion@Error,0
- JNE @@1
- LES BX,TFuncion@Funcion
- MOV AX,ES
- OR AX,BX
- JZ @@1
- Virtual TBaseFunc,Result,Actual
- MOV AX,ErrorMatemat
- LES BX,@Self
- MOV TFuncion@ErrorCalc,AX
- @@0: RET
- @@1: FLDZ
- JMP @@0
- @TFuncion@Result$qv ENDP
-
- @TFuncion@HayError$qv PROC @Self: DWORD
- PUBLIC @TFuncion@HayError$qv
- LES BX,@Self
- MOV AX,TFuncion@Error
- OR AX,TFuncion@ErrorCalc
- RET
- @TFuncion@HayError$qv ENDP
-
-
- @TFuncion@Parentesis$qmit1 PROC Ini: DWORD, Fin: DWORD, @Self: DWORD
- PUBLIC @TFuncion@Parentesis$qmit1
- PUSH DS
- PUSH SI
- PUSH DI
- LDS BX,Ini
- MOV CX,[BX]
- LDS BX,Fin
- MOV DI,[BX]
- LES BX,@Self
- LDS BX,TFuncion@funcion
- XOR AX,AX
- @@1: MOV SI,CX
- CMP SI,DI
- JZ @@4
- CMP BYTE PTR [BX+SI],'('
- JNE @@4
- MOV DX,1
- @@2: INC SI
- CMP SI,DI
- JE @@4
- CMP BYTE PTR [BX+SI],'('
- JNE @@3
- INC DX
- JMP @@2
- @@3: CMP BYTE PTR [BX+SI],')'
- JNE @@2
- DEC DX
- JNZ @@2
- INC SI
- CMP SI,DI
- JNE @@4
- INC CX
- DEC DI
- MOV AX,1
- JMP @@1
- @@4: LDS BX,Ini
- MOV [BX],CX
- LDS BX,Fin
- MOV [BX],DI
- POP DI
- POP SI
- POP DS
- RET
- @TFuncion@Parentesis$qmit1 ENDP
-
- @TFuncion@BuscaNumero$qmiinzc PROC Ini: DWORD, Fin: WORD, Numero: DWORD, @Self: DWORD
- PUBLIC @TFuncion@BuscaNumero$qmiinzc
- PUSH DS
- PUSH SI
- PUSH DI
- LES BX,Ini
- MOV CX,ES:[BX]
- LES BX,@Self
- LDS SI,TFuncion@funcion
- ADD SI,CX
- PUSH SI
- XOR BX,BX
- CLD
- @@0: CMP CX,Fin
- JAE @@6
- LODSB
- CMP AL,'0'
- JB @@00
- CMP AL,'9'
- JBE @@1
- CMP AL,'E'
- JZ @@3
- @@00: CMP AL,'-'
- JZ @@5
- CMP AL,'+'
- JZ @@5
- CMP AL,'.'
- JNZ @@6
- @@1: XOR BL,BL
- @@2: INC CX
- JMP @@0
- @@3: OR BH,BH
- JNZ @@4
- MOV BX,0101H
- JMP @@2
- @@4: LES BX,@Self
- MOV TFuncion@Error,1
- INC CX
- JMP SHORT @@6
- @@5: OR BL,BL
- JNZ @@1
- @@6: LES BX,Ini
- MOV AX,CX
- XCHG AX,ES:[BX]
- SUB CX,AX
- POP SI
- LES DI,Numero
- REP MOVSB
- XOR AL,AL
- STOSB
- POP DI
- POP SI
- POP DS
- RET
- @TFuncion@BuscaNumero$qmiinzc ENDP
-
- @TFuncion@BuscaSumando$qiimi PROC Ini: WORD, Fin: WORD, Pos: DWORD, @Self: DWORD
- PUBLIC @TFuncion@BuscaSumando$qiimi
- PUSH DS
- PUSH SI
- LES BX,@Self
- LDS SI,TFuncion@funcion
- MOV CX,Ini
- ADD SI,CX
- XOR DX,DX
- CLD
- JMP SHORT @@1
- @@0: INC CX
- @@1: CMP CX,Fin
- JAE @@6
- LODSB
- CMP AL,'('
- JNZ @@2
- INC DX
- JMP @@0
- @@2: CMP AL,')'
- JNZ @@4
- DEC DX
- JGE @@0
- @@3: MOV TFuncion@Error,1
- JMP SHORT @@7
- @@4: CMP AL,'+'
- JE @@5
- CMP AL,'-'
- JNE @@0
- @@5: OR DX,DX
- JG @@0
- CMP CX,Ini
- JZ @@0
- MOV AH,[SI-2]
- CMP AH,'E'
- JZ @@0
- CMP AH,'*'
- JZ @@0
- CMP AH,'/'
- JZ @@0
- CMP AH,'^'
- JZ @@0
- @@6: CMP CX,Ini
- JE @@3
- @@7: LDS BX,Pos
- MOV [BX],CX
- POP SI
- POP DS
- RET
- @TFuncion@BuscaSumando$qiimi ENDP
-
- @TFuncion@BuscaProducto$qiimi PROC Ini: WORD, Fin: WORD, Pos: DWORD, @Self: DWORD
- PUBLIC @TFuncion@BuscaProducto$qiimi
- PUSH DS
- PUSH SI
- LES BX,@Self
- LDS SI,TFuncion@funcion
- MOV CX,Ini
- ADD SI,CX
- XOR DX,DX
- CLD
- JMP SHORT @@1
- @@0: INC CX
- @@1: CMP CX,Fin
- JE @@6
- LODSB
- CMP AL,'*'
- JE @@2
- CMP AL,'/'
- JNE @@3
- @@2: OR DX,DX
- JZ @@6
- JMP @@0
- @@3: CMP AL,'('
- JNE @@4
- INC DX
- JMP @@0
- @@4: CMP AL,')'
- JNE @@0
- DEC DX
- JNS @@0
- @@5: MOV TFuncion@Error,1
- JMP SHORT @@7
- @@6: CMP CX,Ini
- JE @@5
- @@7: LDS BX,Pos
- MOV [BX],CX
- POP SI
- POP DS
- RET
- @TFuncion@BuscaProducto$qiimi ENDP
-
- @TFuncion@BuscaPotencia$qiimi PROC Ini: WORD, Fin: WORD, Pos: DWORD, @Self: DWORD
- PUBLIC @TFuncion@BuscaPotencia$qiimi
- PUSH DS
- PUSH SI
- LES BX,@Self
- LDS SI,TFuncion@funcion
- MOV CX,Ini
- ADD SI,CX
- XOR DX,DX
- CLD
- JMP SHORT @@1
- @@0: INC CX
- @@1: CMP CX,Fin
- JE @@5
- LODSB
- CMP AL,'^'
- JNZ @@2
- OR DX,DX
- JZ @@5
- JMP @@0
- @@2: CMP AL,'('
- JNZ @@3
- INC DX
- JMP @@0
- @@3: CMP AL,')'
- JNZ @@0
- DEC DX
- JGE @@0
- @@4: MOV TFuncion@Error,1
- JMP SHORT @@6
- @@5: CMP CX,Ini
- JE @@4
- OR DX,DX
- JNZ @@4
- @@6: LDS SI,Pos
- MOV [SI],CX
- POP SI
- POP DS
- RET
- @TFuncion@BuscaPotencia$qiimi ENDP
-
- @TFuncion@BuscaParametro$qiimi PROC Ini: WORD, Fin: WORD, Pos: DWORD, @Self: DWORD
- PUBLIC @TFuncion@BuscaParametro$qiimi
- PUSH DS
- PUSH SI
- LES BX,@Self
- LDS SI,TFuncion@funcion
- MOV CX,Ini
- ADD SI,CX
- CMP BYTE PTR [SI],'('
- JNE @@3
- XOR DX,DX
- CLD
- @@1: CMP CX,Fin
- JZ @@4
- LODSB
- INC CX
- CMP AL,'('
- JNE @@2
- INC DX
- JMP @@1
- @@2: CMP AL,')'
- JNE @@1
- DEC DX
- JZ @@4
- JMP @@1
- @@3: MOV TFuncion@Error,1
- @@4: LDS BX,Pos
- MOV [BX],CX
- POP SI
- POP DS
- RET
- @TFuncion@BuscaParametro$qiimi ENDP
-
-
- @EsCaract$qzc PROC
- PUBLIC @EsCaract$qzc
- PUSH BP
- MOV BP,SP
- MOV CL,[BP+6]
- XOR AX,AX
- CMP CL,'A'
- JB @@1
- CMP CL,'Z'
- JA @@1
- INC AX
- @@1: POP BP
- RET
- @EsCaract$qzc ENDP
-
- @EsNumero$qzc PROC
- PUBLIC @EsNumero$qzc
- PUSH BP
- MOV BP,SP
- MOV CL,[BP+6]
- XOR AX,AX
- CMP CL,'.'
- JZ @@1
- CMP CL,'0'
- JB @@2
- CMP CL,'9'
- JA @@2
- @@1: INC AL
- @@2: POP BP
- RET
- @EsNumero$qzc ENDP
-
- END
-